package collection;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.Random;

/**
 *   终端操作:
 *   min:获取流中元素的最小值
 *   max:获取流中元素的最大值
 *   anyMatch:流中是否有元素匹配
 *   allMatch:流中是否所有元素匹配
 *   noneMatch:流中任何元素是否都没有匹配
 *   reduce:积累操作，将流中所有元素积累成一个值
 */
public class StreamDemo2 {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        Random random = new Random();
        for(int i=0;i<3;i++){
            list.add(random.nextInt(100));
        }
        System.out.println(list);
        /*
            找到流中的最大值
            Optional有点包装类的感觉，是对一个值的包装。
         */
        Optional<Integer> optional = list.stream().max((e1, e2)->e1-e2);
        int d = optional.get();
        System.out.println(d);

        //判断集合中是否有偶数
        boolean match = list.stream().anyMatch(e->e%2==0);
        System.out.println("存在偶数:"+match);
        //判断集合中是否所有元素都>50
        match = list.stream().allMatch(e->e>50);
        System.out.println("元素都>50:"+match);
        //判断集合元素是否都不<1
        match = list.stream().noneMatch(e->e<1);
        System.out.println("元素是否都不匹配:"+match);

        //计算集合中所有元素的总和
        /*
            [1,2,3,4,5,6,7,8]    第一次reduce(e1,e2)  e1:1  e2:2    1+2=3
            [3,3,4,5,6,7,8]  第一个元素3是上次reduce前两个元素的结果
            [6,4,5,6,7,8]    第一个元素6是上次reduce前两个元素的结果
            [10,5,6,7,8]
            ...
         */
//        optional = list.stream().reduce((e1,e2)->e1+e2);
//        optional = list.stream().reduce((e1,e2)->Integer.sum(e1,e2));//sum内部逻辑e1+e2
        optional = list.stream().reduce(Integer::sum);
        int sum = optional.get();
        System.out.println("总和:"+sum);
    }
}
